package inventario;

import conexion.CConexion;
import java.io.IOException;
import java.sql.CallableStatement;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import utilitario.CFecha;

public class CInvexi100 extends CConexion {

    CFecha fechaSistema = null;
    String compania = null;
    String usuarioActual = null;
    String fechaActual = null;

    public CInvexi100() {
        super();
        fechaSistema = new CFecha();
        this.compania = login.getCompaniaActual();
        this.usuarioActual = login.getUsuarioLogin();
        this.fechaActual = fechaSistema.getFechaCompleta();
    }

    public ResultSet busquedaPorCodigo(String codigoProducto) throws SQLException {
        String sqlBusquedaPorCodigo = "select * from invexi100 where exi100nocia = '" + compania + "' and exi100cdgo = '" + codigoProducto + "'";
        Statement stncBusquedaPorCodigo = this.getConexion().createStatement();
        ResultSet rsBusquedaPorCodigo = stncBusquedaPorCodigo.executeQuery(sqlBusquedaPorCodigo);
        return rsBusquedaPorCodigo;
    }

    public Double existencia(String codigoProducto, String lote, String fechaCaducidad) throws SQLException {
        String sqlExistencia = "select sum(exi100sact) as existencia from invexi100 where exi100nocia = '" + compania + "'";
        if (!codigoProducto.isEmpty()) {
            sqlExistencia += " and exi100cdgo = '" + codigoProducto + "'";
        }
        if (!lote.isEmpty()) {
            sqlExistencia += " and exi100lote = '" + lote + "'";
        }
        if (!fechaCaducidad.isEmpty()) {
            sqlExistencia += " and exi100fech = '" + fechaCaducidad + "'";
        }
        Statement stncExistencia = this.getConexion().createStatement();
        Double existencia = stncExistencia.executeQuery(sqlExistencia).getDouble("existencia");
        stncExistencia.close();
        return existencia;
    }

    public void ActualizaTablaCR(String bodega, String codigoProducto, String tipoMovimiento, String cantidad, String costoUnitario, String numeroComprobante, String clienteOProveedor, String fechaCaducidad, String lote) throws IOException, SQLException {
        CInvCd100 invcd100 = new CInvCd100();
        double saldoInicial = 0.00;
        double saldoActual = 0.00;
        double saldoActualKardex = 0.00;
        double costoPromedio = 0.00;
        double costoPromedioAnterior = 0.00;
        String costoPromedioAnteriorKx = "";
        String costoPromedioActualKx = "";
        ResultSet rsBusqueda = this.busquedaPorCodigo(codigoProducto);
        String sql = "";
        if (tipoMovimiento.equals("IN")) {
            if (rsBusqueda.next()) {
                saldoActual = this.existencia(rsBusqueda.getString("exi100cdgo"), "", "");
                saldoActualKardex = saldoActual;
                ResultSet rsCostosCd100 = invcd100.buscarProductoPorCodigo(codigoProducto);
                rsCostosCd100.next();
                costoPromedio = Double.parseDouble(rsCostosCd100.getString("cd100copr"));
                costoPromedioAnterior = Double.parseDouble(rsCostosCd100.getString("cd100coul"));
                costoPromedioAnteriorKx = rsCostosCd100.getString("cd100copr");
                costoPromedio = (saldoActual * Double.parseDouble(rsCostosCd100.getString("cd100copr")) + Double.parseDouble(cantidad) * Double.parseDouble(costoUnitario)) / (saldoActual + Double.parseDouble(cantidad));
                costoPromedioAnterior = Double.parseDouble(rsCostosCd100.getString("cd100coan"));
                //invcd100.actualizarCostos(codigoProducto, rsCostosCd100.getDouble("cd100copr"), costoPromedio, Double.parseDouble(costoUnitario));
//                sql = "updat e invcd100 set cd100coan = '" + rsCostosCd100.getString("cd100copr") + "', cd100copr = '" + String.valueOf(costoPromedio) + "', cd100coul = '" + costoUnitario + "' where cd100nocia = '" + compania + "' and cd100cdgo = '" + codigoProducto + "'";
//                stncAqui.executeUpdate(sql);
                costoPromedioActualKx = String.valueOf(costoPromedio);
            } else {
                saldoInicial = 0;
                saldoActual = Double.parseDouble(cantidad);
                saldoActualKardex = 0;
                costoPromedioAnterior = saldoActual;
                costoPromedio = Double.parseDouble(costoUnitario);
                sql = "select * from invcd100 where cd100nocia = '" + compania + "' and cd100cdgo = '" + codigoProducto + "'";
                Statement stncAqui = this.getConexion().createStatement();
                ResultSet rsAqui = stncAqui.executeQuery(sql);
                if (rsAqui.next()) {
                    costoPromedioAnteriorKx = rsAqui.getString("cd100copr");
                    costoPromedio = (saldoActual * Double.parseDouble(rsAqui.getString("cd100copr")) + Double.parseDouble(cantidad) * Double.parseDouble(costoUnitario)) / (saldoActual + Double.parseDouble(cantidad));
                    costoPromedioAnterior = Double.parseDouble(rsAqui.getString("cd100coan"));
                    sql = "update invcd100 set cd100coan = '0.00', cd100copr = '" + costoUnitario + "', cd100coul = '" + costoUnitario + "' where cd100nocia = '" + compania + "' and cd100cdgo = '" + codigoProducto + "'";
                    stncAqui.executeUpdate(sql);
                    costoPromedioActualKx = String.valueOf(costoPromedio);
                }
            }
        }
        String noli = "1";
        Statement stncAqui2 = this.getConexion().createStatement();
        ResultSet rsAqui2 = stncAqui2.executeQuery("select max(kx100noli) from invkx100 where kx100nocia = '" + compania + "' and kx100cdgo = '" + codigoProducto + "' and kx100bode='" + bodega + "' and kx100lote = '" + lote + "'");
        if (rsAqui2.first()) {
            noli = String.valueOf(rsAqui2.getInt(1) + 1);
        }
        String vamo = String.valueOf(Double.parseDouble(costoUnitario) * Double.parseDouble(cantidad));
        if (tipoMovimiento.equals("IN")) {
            System.out.println("ENTRO A IN");
            this.actualizarExistencia(bodega, codigoProducto, "IN", "10", cantidad, lote, fechaCaducidad);
            rsAqui2 = stncAqui2.executeQuery("select * from invexi100 where exi100nocia = '" + compania + "' and exi100cdgo = '" + codigoProducto + "' and exi100bode = '" + bodega + "' and exi100lote = '" + lote + "' and exi100feca = '" + fechaCaducidad + "'");
            rsAqui2.next();
            double exan = Double.parseDouble(rsAqui2.getString("exi100sact"));
            exan = exan - Double.parseDouble(cantidad);
            sql = "insert into invkx100 values ('" + compania + "','" + bodega + "','" + codigoProducto + "','" + lote + "','" + noli + "','" + "I" + "','10','CIN','" + numeroComprobante + "','" + fechaActual + "','" + clienteOProveedor + "','" + vamo + "','" + String.valueOf(exan) + "','" + cantidad + "','" + rsAqui2.getString("exi100sact") + "','" + costoPromedioAnteriorKx + "','" + costoPromedioActualKx + "','0.00',' ',' ','A','" + usuarioActual + "','" + fechaActual + "','" + usuarioActual + "','" + fechaActual + "')";
        }
        if (tipoMovimiento.equals("EG")) {
            System.out.println("ENTRO A EG");
            String cpaneg = "";
            String cpaceg = "";
            rsAqui2 = stncAqui2.executeQuery("select * from invcd100 where cd100cdgo = '" + codigoProducto + "' and cd100nocia = '" + compania + "'");
            rsAqui2.next();
            cpaneg = rsAqui2.getString("cd100coan");
            cpaceg = rsAqui2.getString("cd100coul");
            rsAqui2 = stncAqui2.executeQuery("select * from invexi100 where exi100nocia = '" + compania + "' and exi100cdgo = '" + codigoProducto + "' and exi100bode = '" + bodega + "' and exi100lote = '" + lote + "' and exi100feca = '" + fechaCaducidad + "'");
            rsAqui2.next();
            double exan = Double.parseDouble(rsAqui2.getString("exi100sact"));
            exan = exan + Double.parseDouble(cantidad);
            sql = "insert into invkx100 values ('" + compania + "','" + bodega + "','" + codigoProducto + "','" + lote + "','" + noli + "','" + "E" + "','20','CEG','" + numeroComprobante + "','" + fechaActual + "','" + clienteOProveedor + "','" + vamo + "','" + String.valueOf(exan) + "','" + cantidad + "','" + rsAqui2.getString("exi100sact") + "','" + cpaneg + "','" + cpaceg + "','0.00',' ',' ','A','" + usuarioActual + "','" + fechaActual + "','" + usuarioActual + "','" + fechaActual + "')";
        }
        stncAqui2.executeUpdate(sql);
    }

    public void actualizarExistencia(String bodega, String codigoProducto, String tipoMovimiento, String codigoConcepto, String cantidad, String lote, String fechaCaducidad) throws SQLException {
        CallableStatement po = this.getConexion().prepareCall("{ call actualiza_exi(?,?,?,?,?,?,?,?,?,?) }");
        po.setString("nocia", compania);
        po.setString("bode", bodega);
        po.setString("cdgo", codigoProducto);
        po.setString("timo", tipoMovimiento);
        po.setString("coco", codigoConcepto);
        po.setDouble("cant", Double.parseDouble(cantidad));
        po.setDate("fech", Date.valueOf(fechaActual));
        po.setString("lote", lote);
        po.setDate("feca", Date.valueOf(fechaCaducidad));
        po.setString("usuario", usuarioActual);
        po.execute();
    }
}
